<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
<script type="text/javascript">
	//1.基本用法
	// for (var i=0; i< 10; i++)
	// 	console.log(i);
	// console.log('out i=' + i);
	//2.基本用法
	// for (let i=0; i< 10; i++)
	// 	console.log(i);
	// console.log('out i=' + i);
	//3.当前的i只在本轮循环有效，所以每一次循环的i其实都是一个新的变量，所以最后输出的是6
	// var a = [];
	// for (let i = 0; i < 10 ; i++)
	// 	a[i] = function(){
	// 		console.log(i);
	// 	}
	// a[6]();//6，如果将let换位var则输出10
	//4.就是设置循环变量的那部分是一个父作用域，而循环体内部是一个单独的子作用域。
	// for (let i=0; i<3; i++){
	// 	let i = 'abc';
	// 	console.log(i);//输出3次‘abc’
	// }
	//5.不存在变量
	// console.log(foo);//输出undefined
	// var foo = 2;
	// console.log(bar);//报错
	// let bar = 2;
	//6.暂时性死区
	// var tmp = 123;
	// if (true) {
	// 	tmp = 'abc';//报错RefrenceError
	// 	 let tmp;
	// }
	// console.log(tmp);
	//6.1.typeof 不绝对性安全
	// console.log(typeof x);//报错RefrenceError
	// let x;
	//6.2不易发现的
	// function bar(x = y, y = 2){
	// 	return [x, y];
	// }
	// let r = bar();//报错
	// console.log(r);

	// function bar(x = 2, y = x){
	// 	return [x, y];
	// }
	// let r = bar();//
	// console.log(r);

	//7.不允许重复声明。测试无效
	// function func(arg){
	// 	let arg;
	// 	{
	// 		let arg;
	// 	}
	// }

	//8.块级作用域
	// var tmp = new Date();
	// function f(){
	// 	console.log(tmp);
	// 	if (false) {
	// 		var tmp = 'hello'
	// 	}
	// }
	// f();//undefined

	// function f1(){
	// 	let n = 5;
	// 	if (true) {
	// 		let n = 10;
	// 	}
	// 	console.log(n);//5
	// }
	// f1();

function f() { console.log('I am outside!'); }

(function () {
  if (true) {
    // 重复声明一次函数f
    function f() { console.log('I am inside!'); }
  }

  f();
}());




</script>
</body>
</html>